package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOOrdenPedido;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.Empresa;
import pe.com.cotelasa.scp.entidad.OrdenPedido;

/**
 *
 * @author usuario
 */
@Service
public class ServicioOrdenPedidoImpl implements IServicioOrdenPedido, Serializable {

    @Inject
    private IDAOOrdenPedido daoOrdenPedido;

    @Override
    public Collection<OrdenPedido> listarOrdenesPedidoActivos() throws ServiceException {
        try {
            return daoOrdenPedido.listarActivos(OrdenPedido.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public OrdenPedido obtenerOrdenPedidoPorCodigo(OrdenPedido ordenPedido) throws ServiceException {
        try {

            return daoOrdenPedido.obtenerOrdenPedidoPorCodigo(ordenPedido);

        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenPedido> listarOrdenesPedidoPorEstado(OrdenPedido ordenPedido) throws ServiceException {
        try {

            return daoOrdenPedido.obtenerOrdenesPedidoPorEstado(ordenPedido);

        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public OrdenPedido conseguirOrdenPedidoPorId(Integer idOrdenPedido) throws ServiceException {
        try {
            return daoOrdenPedido.obtenerEntidadPorId(OrdenPedido.class, idOrdenPedido);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public ResultadoServicio guardarOrdenPedido(OrdenPedido ordenPedido) throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            ordenPedido.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            daoOrdenPedido.insertar(ordenPedido);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
        return resultadoServicio;
    }

    @Override
    public ResultadoServicio actualizarOrdenPedido(OrdenPedido ordenPedido) throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            daoOrdenPedido.actualizar(ordenPedido);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
        return resultadoServicio;
    }

    @Override
    public Collection<OrdenPedido> listarOrdenPedidosPorFiltro(OrdenPedido ordenPedido, Date fechaInicio, Date fechaFin) throws ServiceException {
        try {
            /*Map<String, Object> parametro = new HashMap<String, Object>();
             if (ordenPedido.getIdCliente() != null) {
             parametro.put("clienteMarca", ordenPedido.getClienteMarca().getId());
             }
             parametro.put("codigoOrdenPedido", ordenPedido.getCodigoOrdenPedido());
             parametro.put("estadoPedido", ordenPedido.getEstadoPedido());
             parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
             parametro.put("idEmpresa", ordenPedido.getIdEmpresa().getId());
             return daoOrdenPedido.obtenerColeccionEntidadPorFiltros(OrdenPedido.class, parametro);*/
            return daoOrdenPedido.listarOrdenPedidosPorFiltro(ordenPedido, fechaInicio, fechaFin);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenPedido> listarOrdenesPedidoActivosPorEmpresa(OrdenPedido ordenPedido) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            parametro.put("idEmpresa", ordenPedido.getIdEmpresa().getId());
            return daoOrdenPedido.obtenerColeccionEntidadPorFiltros(OrdenPedido.class, parametro,"codigoOrdenPedido","ASC");
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenPedido> listarOrdenesPedidoActivosPorTipo(OrdenPedido ordenPedido) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            parametro.put("idEmpresa", ordenPedido.getIdEmpresa().getId());
            parametro.put("tipoOp", "" + ordenPedido.getTipoOp());
            return daoOrdenPedido.obtenerColeccionEntidadPorFiltros(OrdenPedido.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public int buscarCantidadOP(OrdenPedido ordenPedido) throws ServiceException {
        try {
            return daoOrdenPedido.buscarCantidadOP(ordenPedido);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
}
